import {
  getSysDeptList,
  getSysDeptDetail,
  addSysDeptDetail,
  editSysDeptDetail,
  delSysDeptDetail,
  batchDelSysDeptDetail
} from "@/api/system/dept";
import { reactive, ref } from "vue";
import { arrayToTree } from "@/utils/truncate";
import type { PlusPageInstance } from "plus-pro-components";

// 空数据提示（错误提示）
export const tableEmptyText = ref("");

// 页面组件
export const plusPageRef = ref<PlusPageInstance | null>();

// 状态参数
const state = reactive({
  parentsCache: [],
  parentsCacheInit: false
});

type ParentOption = {
  /**
   * 从结果集中移除指定子集，通常在编辑时用于移除自己
   */
  removes?: Id[];
};

const request = {
  event: {
    /**
     * 列表页面初始化成功时调用
     * 如果开启了 KeepAlive，会在激活后再次调用
     *
     * @param keepAlive 本次调用是否为 keepAlive 激活调用
     * @returns
     */
    onPageShow: async (keepAlive: boolean): Promise<void> => {
      if (keepAlive) {
        plusPageRef.value?.getList();
      }
    }
  },
  get: {
    /**
     * 获取父级options
     *
     * @param option 配置参数
     * @returns
     */
    parentsOptions: async (options?: ParentOption) => {
      let res = state.parentsCache;
      if (!state.parentsCacheInit) {
        res = (await getSysDeptList()).data;
        state.parentsCache = res;
        state.parentsCacheInit = true;
      }
      return arrayToTree(res, {
        transform: item => {
          // 编辑时移除自己和子集
          if (options?.removes && options?.removes?.includes(item.id))
            return false;
          return {
            value: item.id,
            label: item.deptName
          };
        }
      });
    },
    /**
     * 获取完整列表
     *
     * @param params 请求参数
     * @returns
     */
    list: async (params: object) => {
      try {
        const res = await getSysDeptList(params);
        tableEmptyText.value = "资料暂无";
        state.parentsCache = res.data;
        state.parentsCacheInit = true;
        return {
          data: arrayToTree(res.data),
          total: res.data.length
        };
      } catch (error) {
        tableEmptyText.value = error.message;
      }
    },
    /**
     * 获取详情
     *
     * @param id 请求ID
     * @returns
     */
    detail: async (id: Id) => {
      return (await getSysDeptDetail(id)).data;
    }
  },
  post: {
    /**
     * 新增信息
     *
     * @param data 请求参数
     * @returns
     */
    create: async (data: object) => {
      const res = await addSysDeptDetail(data);
      return { id: res.data.id };
    }
  },
  put: {
    /**
     * 更新信息
     *
     * @param id 请求ID
     * @param data 请求参数
     */
    update: async (id: Id, data: object) => {
      await editSysDeptDetail(id, data);
    }
  },
  delete: {
    /**
     * 删除信息
     *
     * @param id 请求ID
     */
    remove: async (id: Id) => {
      await delSysDeptDetail(id);
    },
    /**
     * 批量删除信息
     *
     * @param ids 指定的ID
     */
    batch: async (ids: Id[]) => {
      await batchDelSysDeptDetail({
        ids
      });
    }
  }
};

export default request;
